package me.timlong;

public class Decimal2Binary1Count {

    /**
     *
     * 输入一个整数，输出该数二进制表示中1的个数。其中负数用补码表示。
     *
     * 解决方案：按位与
     * java中会把整数按照正数原码，负数不补码的形式存储，于是考虑到使用按位与，按位或运算进行计算1的个数
     *
     * eg: 110101 = d53
     *     110100 = d52
     *     53 & 52 = 110100
     *
     *
     */
    public int NumberOf1(int n) {

        int oneNum = 0;

        while(n != 0){

            oneNum += 1;
            n = n & (n  - 1);
        }

        return oneNum;
    }


    /**
     *
     * 题目描述
     * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
     *
     * 保证base和exponent不同时为0
     *
     *
     * Java 库函数 Math.pow()
     *
     * @param base
     * @param exponent
     * @return
     */
    public double Power(double base, int exponent) {
        if(0 == base)
            return 0;
        else if(1 == base)
            return 1;

        int ex = exponent > 0 ? exponent : -exponent;

        double power = 1;
        while(0 != ex){
            power *= base;
            ex--;
        }
        return exponent > 0 ? power : 1. / power;
    }


    /**
     * 快速幂算
     *
     * 指数位操作
     */

    public double power2(double base, int exponent){
        if(0 == base)
            return 0;
        if (1 == base)
            return 1;

        double result = 1.;
        int exp = exponent > 0 ? exponent : -exponent;

        while(0 != exp){
            if(0 != (exp & 1))
                result *= base;

            base *= base;
            exp = exp / 2;
        }

        return exponent > 0 ? result : 1. / result;
    }





    public static void main(String[] args) {


        System.out.println(new Decimal2Binary1Count().power2(2, 2));


    }
}
